package com.coder.rental.utils;

import cn.hutool.core.date.DateTime;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import cn.hutool.jwt.JWTUtil;
import org.springframework.stereotype.Component;

import java.util.Map;

@Component
public class JWTUtils {
    //JWT密钥
    public static final String SECRET_KEY = "zouyu";
    //JWT过期时间
    public static final long EXPIRE_TIME = 1000L*60*30;
    /**
     * 创建JWT Token
     * @param payload 包含Token载荷信息的Map，将被添加时间相关字段
     * @return 生成的JWT Token字符串
     */
    public static String createToken(Map<String, Object> payload) {
        DateTime now = DateTime.now();
        DateTime newTime = new DateTime(now.getTime() + EXPIRE_TIME);

        // 设置Token的时间相关参数
        payload.put(JWTPayload.ISSUED_AT, now);
        payload.put(JWTPayload.EXPIRES_AT, newTime);
        payload.put(JWTPayload.NOT_BEFORE, now);

        return JWTUtil.createToken(payload, SECRET_KEY.getBytes());
    }

    /**
     * 解析并验证JWT token
     * @param token 待解析的JWT token字符串
     * @return JWTPayload 返回解析后的token负载数据
     * @throws RuntimeException 当token异常或已过期时抛出运行时异常
     */
    public static JWTPayload parseToken(String token){
        // 解析传入的token字符串
        JWT jwt = JWTUtil.parseToken(token);
        // 验证token的签名，确保token未被篡改
        if (!jwt.setKey(SECRET_KEY.getBytes()).verify()){
            throw new RuntimeException("token异常");
        }
        // 检查token是否过期
        if (!jwt.validate(0)){
            throw new RuntimeException("token已过期");
        }
        // 返回token的payload部分
        return jwt.getPayload();
    }

}
